#ifndef TCPCLIENT_H
#define TCPCLIENT_H

#include<QWidget>
#include<QFile>
#include<QTcpSocket>
#include<QFileInfo>
#include<QTimer>
#include"mainwindow.h"
#include<QThread>
#include "Protocol.h"
#include"socketworker.h"

QT_BEGIN_NAMESPACE
namespace Ui {
class TcpClient;
}
QT_END_NAMESPACE

class TcpClient : public QWidget
{
    Q_OBJECT

public:
    TcpClient(QWidget *parent = nullptr);
    ~TcpClient();

    void loadConfig();

    static TcpClient &getInstance();

    //校验字符串
    bool validateString(const QString &input);

    //获取当前所在文件目录
    QString curDirPath();
    //获取当前用户名
    QString usrName();
    //获取当前用户密码
    QString usrPassword();

    //用户下线
    void usrOffline();
    //根据name查找对应用户
    void searchUsr(QString name);

    //添加好友
    void addUsr(QString addName);

    //刷新好友列表
    void flushFriendList();

    //删除好友
    void deleteFriend(QString deleteName);


    //私聊好友
    void privateChat(QString chatName,QString msg);

    //群聊
    void groupChat(QString msg);


    //新建文件夹
    void createDir(QString createDirName);

    //刷新文件夹
    void flushDir();

    //删除文件/文件夹
    void delDir_File(QString dir_Filename);

    //重命名文件/文件夹
    void renameDir_File(QString oldName,QString newName);

    //进入文件夹
    void entryDir(QString dirName);

    //返回上一级文件夹
    void backDir();

    //上传文件
    void uploadFile(QString uploadFilePath);

    //下载文件
    void downLoadFile(QString fileName,QString saveFilePath);


    //移动文件
    void moveFile(QString sourceFilePath,QString fileName,QString targetPath);

    //注销用户
    void usrLogOff();

    //获取在线好友
    void getOnlineFriend();

    //分享文件
    void shareFile(QList<QString>friendList,QString fileName);

    //修改用户信息
    void modifyUsrInfo(QString oldUsrName,QString newUsrName,QString newPwd);
public slots:

    void showTipMessage(int flag,QString parent,const QString&txt,int duration=1000);
    //flag=1:information
    //flag=2:warning
    //flag=3:critical

    //进度条相关操作
    void setProgressBarValue(int value);
    void setProgessBarClosedEnabled(bool flag);
    void hideProgressBar();
    void showProgressBar();
    void setProgressBarTitle(const QString &title);
    //更新状态栏描述信息
    void setStatusBarMsg(const QString &msg);

    //用户登陆成功
    void usrLogInSuccess(QString name);

    void flushSearchPage();

    void getSearchData(QList<UserInfo> resultList);

    //刷新好友列表
    void updateFriendList(QMap<QString,QString>friendList);
    //私聊消息
    void getPrivateChatMsg(const QString&chatName,const QString&msg);
    //群聊消息
    void getGroupChatMsg(const QString&msg,const QString&timeText);
    //刷新文件列表
    void updateFileList(QMap<QString,int>filelist);

    void handleAddFriendRequest(const QString&addName, const QString&usrName);
    //1.注册
    void on_regBtn_clicked();

    //2.登录
    void on_logInBtn_clicked();

    void closeMainWinow();

    void getOnlineFriendList(QList<QString> resultList);

    void handleShareFileRequest(const QString &usrName,const QString &filePath);
signals:
    void connectToServer(const QString &ip, quint16 port);
    //1.注册
    void registerSignal(const QString &usrName,const QString &password);
    //2.登录
    void logInSignal(const QString &usrName,const QString &password);
    //3.根据名称查找用户
    void searchUsrByNameSignal(const QString&name);
    //4.添加好友
    void addUsrSignal(const QString &addName);
    //5.刷新好友列表
    void flushFriendListSignal();
    //6.删除好友
    void deleteFriendSignal(const QString &deleteName);
    //7.群聊消息
    void sendGroupChatSignal(const QString&msg);
    //8.私聊信息
    void sendPrivateChatSignal(const QString&chatName,const QString&msg);
    //19.用户下线
    void offlineSignal();
    //10.新建文件夹
    void createNewDirSignal(const QString &dirName);
    //11.刷新文件号
    void flushDirSignal();
    //12.删除文件/文件夹信号
    void deleteDir_FileSignal(const QString& dir_FileName);
    //13.重命名文件/文件夹
    void renameDir_FileSignal(const QString &oldName,const QString &newName);
    //14.进入文件夹
    void entryDirSignal(const QString&dirName);
    //15.返回上一级
    void backDirSignal();
    //16.上传文件
    void uploadFileSignal(const QString& upLoadFilePath);
    //17.下载文件
    void downLoadFileSignal(const QString& fileName,const QString& saveFilePath);
    //18.移动文件
    void moveFileSignal(const QString& sourcePath,const QString& fileName,const QString& targetPath);
    //添加好友处理结果
    void addFriendHandle(bool isAgree,const QString&addName, const QString&usrName);
    //19.注销账号
    void logOffSignal();
    //20.获取在线好友
    void onlineFriSignal();
    //21.分享文件
    void shareFileSignal(const QList<QString>&friendList,const QString &name);
    //22.分享文件结果处理
    void shareFileFeedBack(bool isAgree,const QString&path);
    //修改用户信息
    void modifyInfoSignal(const QString& oldUsrName,const QString& newUsrName,const QString& newPwd);
private slots:
    void on_miniumBtn_clicked();

    void on_closeBtn_clicked();

private:
    Ui::TcpClient *ui;

    QThread *m_workerThread=nullptr;
    SocketWorker *m_worker=nullptr;

    //ip和端口号
    QString m_ip;
    unsigned short m_port;

    MainWindow *m_mainwindow=nullptr;

};
#endif // TCPCLIENT_H
